<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      /*
       一般来说，子串子数组这种都可以用暴力法，找出所有的子数组，然后判断。
       优化方法一般来说都是滑动窗口
        */
      var lengthOfLongestSubstring = function (s) {
        let left = 0;
        //用map存放元素和其下标
        let map = new Map();
        let resLen = 0;
        for (let i = 0; i < s.length; i++) {
          if (!map.has(s[i])) {
            map.set(s[i], i);
            //因为可能没有重复的  比如 a b c d
            resLen = Math.max(resLen, i - left + 1);
          } else {
            //修改left,有个细节就是当前要换的必须比之前的left大，不然会重置！！
            //比如原来c相同 left==3了  后面到b left又变成了2这就错了
            if (left <= map.get(s[i])) {
              left = map.get(s[i]) + 1;
            }
            //遇到重复的，left就后移,注意，是原来的那位置后移一位，然后更新
            resLen = Math.max(resLen, i - left + 1);
            //修改map
            map.set(s[i], i);
          }
        }
        return resLen;
      };
      console.log(lengthOfLongestSubstring("abcdacbe"));
    </script>
  </body>
</html>
